import { getImageLinks, loadFile } from './requests.js'import chalk from 'chalk'/** * Получаем объект формата: ключ - id иконки, значение - ссылка на скачивание в заданном формате ( по умолчанию svg ) * @param elements * @param fileId */export const getIconsDownloadLinks: (  elements: string[],  fileId: string) => Promise<Record<string, string>> = async (elements, fileId) => {  console.log('...Fetching download links')  // из исходного массива создаем со строками, содержащими каждая по 100 элементов через запятую. Сделано во избежание ошибки обработки слишком длинного запроса  const groupedByHundredsNodeIds: string[] = []  while (elements.length) {    groupedByHundredsNodeIds.push(elements.splice(0, 100).join(','))  }  // формируем запрос за ссылками на скачивание для каждого элемента из ранее созданного массива  const iconsDownloadLinksPromiseArray: Array<    Promise<{ [p: string]: string }>  > = []  groupedByHundredsNodeIds.forEach((nodeIds) => {    iconsDownloadLinksPromiseArray.push(      getImageLinks(fileId, nodeIds) as Promise<{ [p: string]: string }>    )  })  // получаем массив с объектами формата: ключ - id иконки, значение - ссылка на скачивание  const rawIconsDownloadLinks = await Promise.all(    iconsDownloadLinksPromiseArray  )  // собираем в единый плоский объект все ссылки на скачивание  const result = rawIconsDownloadLinks.reduce((accumulator, currentValue) => {    Object.keys(currentValue).forEach((key) => {      if (key !== undefined) {        accumulator[key] = currentValue[key]      }    })    return accumulator  }, {})  console.log(chalk.green('✔ Download Links fetched'))  return result}/** * Загружаем файлы по ссылке и отдаем массив с содержимым файла и id иконки * @param obj */export const downloadIcons: (  obj: Record<string, string>) => Promise<Array<{ id: string; value: string }>> = async (obj) => {  console.log('...Downloading icons')  const result: any[] = []  const groupedIcons: string[][] = []  const iconKeys: string[] = [...Object.keys(obj)]  while (iconKeys.length) {    groupedIcons.push(iconKeys.splice(0, 100))  }  const getItem = async (key: string) => {    return {      id: key,      value: await loadFile(obj[key])    }  }  const sleep = (ms: number) => {    return new Promise((resolve) => setTimeout(resolve, ms))  }  // скачиваем по 100 иконок каждые 20 секунд, чтобы не превысить rateLimit у aws(цифры выбраны наугад, можно и по 100 качать)  for (let i = 0; i < groupedIcons.length; i++) {    console.log(chalk.green('✔ Start group', i))    const promiseArray: any[] = []    groupedIcons[i].forEach((key) => promiseArray.push(getItem(key)))    const response = await Promise.all(promiseArray)    result.push(...response)    await sleep(20000)  }  console.log(chalk.green('✔ Icons downloaded'))  return result}